package com.xytc.company.company_backend.adminEndPoint.controller;


import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xytc.company.company_backend.adminEndPoint.entity.rto.StoreRto;
import com.xytc.company.company_backend.adminEndPoint.entity.dao.StoreRepositoryDao;
import com.xytc.company.company_backend.adminEndPoint.mapper.IStoreManageMapper;
import com.xytc.company.company_backend.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 店铺管理相关的接口
 */
@Slf4j
@RestController
@RequestMapping("/company/storeManage")
public class StoreManageController {

    @Autowired
    private IStoreManageMapper storeManageMapper;

    /**
     * 接口1.1 新增或编辑店铺信息
     *
     * @param storeRTO
     * @return
     */
    @PostMapping("/addOrUpdateStore")
    public Result<?> addOrUpdateStore(@RequestBody StoreRto storeRTO) {

        StoreRepositoryDao storeRepositoryDao = new StoreRepositoryDao();

        storeRepositoryDao.setStoreName(storeRTO.getStoreName());
        storeRepositoryDao.setMerchantName(storeRTO.getMerchantName());
        storeRepositoryDao.setMerchantPhone(storeRTO.getMerchantPhone());
        storeRepositoryDao.setStoreAddress(storeRTO.getStoreAddress());
        storeRepositoryDao.setStorePrice(storeRTO.getStorePrice());
        storeRepositoryDao.setDescription(storeRTO.getDescription());
        storeRepositoryDao.setStoreStatus(1); // 新增店铺信息时，店铺状态为默认值 1；编辑接口不涉及店铺 上架/下架 状态的更改，上架/下架由接口 1.3 来实现
        storeRepositoryDao.setDelFlag(0); // del_flag 标记为0；删除店铺由接口1.4 来实现

        if (StringUtils.isBlank(storeRTO.getId())) {
            // 先判断表中是否已经有同名的店铺，不允许添加重复店铺名称的店铺
            List<StoreRepositoryDao> list = storeManageMapper.selectList(new LambdaQueryWrapper<StoreRepositoryDao>().eq(StoreRepositoryDao::getStoreName, storeRTO.getStoreName()));
            if (list != null && list.size() > 0) {
                return Result.error("店铺【" + storeRTO.getStoreName() + "】已存在，不能录入重复名称的店铺");
            }
            storeRepositoryDao.setCreateTime(new Date()); // 新增店铺时，创建时间为接口调用时间
            // 店铺id为null或空字符串，新增店铺
            storeManageMapper.insert(storeRepositoryDao);
        } else {
            storeRepositoryDao.setId(storeRTO.getId());
            // 店铺id不为null，也不为空字符串，更新店铺
            storeManageMapper.updateById(storeRepositoryDao);
        }

        return Result.ok();
    }


    /**
     * 接口1.2 根据店铺名或店主名查询符合条件的店铺
     * @param keyword 为null或空字符串，这sql语句中，like "%%"，即不设置过滤条件
     * @param pageNo
     * @param pageSize
     * @return
     */
    @GetMapping("/queryStoreByKeyword")
    public Result<?> queryStoreByKeyword(@RequestParam("keyword") String keyword,
                                         @RequestParam(value = "pageNo", required = false,defaultValue = "1") Integer pageNo,
                                         @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {

        Page<StoreRepositoryDao> page = new Page<>(pageNo, pageSize);
        Page<StoreRepositoryDao> pageStores = storeManageMapper.selectPage(page, new LambdaQueryWrapper<StoreRepositoryDao>().eq(StoreRepositoryDao::getDelFlag, 0)
                .and(wrapper-> wrapper.like(StoreRepositoryDao::getStoreName, keyword).or().like(StoreRepositoryDao::getMerchantName, keyword)));

        List<StoreRto> formatedStores = new ArrayList<>();
        if (pageStores != null && pageStores.getRecords().size() > 0) {
            for (int k = 0 ; k < pageStores.getRecords().size() ; k ++) {
                StoreRepositoryDao storeDo = pageStores.getRecords().get(k);
                StoreRto formatedStore = new StoreRto();

                formatedStore.setId(storeDo.getId());
                formatedStore.setStoreName(storeDo.getStoreName());
                formatedStore.setStoreAddress(storeDo.getStoreAddress());
                formatedStore.setStorePrice(storeDo.getStorePrice());
                formatedStore.setDescription(storeDo.getDescription());
                formatedStore.setMerchantName(storeDo.getMerchantName());
                formatedStore.setMerchantPhone(storeDo.getMerchantPhone());
                formatedStore.setStoreStatus(storeDo.getStoreStatus());

                formatedStores.add(formatedStore);
            }
        }

        JSONObject resultData = new JSONObject();

        resultData.put("totalPages", pageStores.getPages());
        resultData.put("totalCount", pageStores.getTotal());
        resultData.put("currentPage", pageStores.getCurrent());
        resultData.put("stores", formatedStores);

        return Result.ok(resultData);
    }

    /**
     * 接口1.3 切换店铺状态
     * @param storeId
     * @param status 1 表示营业中；2 表示歇业打烊
     * @return
     */
    @PutMapping("/changeStoreState")
    public Result<?> changeStoreState(@RequestParam("storeId") String storeId, @RequestParam("status") Integer status) {

        StoreRepositoryDao storeRepositoryDao = new StoreRepositoryDao();
        storeRepositoryDao.setId(storeId);
        storeRepositoryDao.setStoreStatus(status);

        int updatedCount = storeManageMapper.updateById(storeRepositoryDao);
        if (updatedCount == 0) {
            log.error("update sql 返回0，店铺表中未找到id为 {} 的店铺", storeId);
        } else if (updatedCount > 1) {
            log.warn("update sql 返回{}，更新{}条 id为{}的记录", updatedCount, updatedCount, storeId);
        }

        return Result.ok("店铺状态更新成功");
    }

    /**
     * 接口1.4 删除店铺
     * @param storeId
     * @return
     */
    @DeleteMapping("/deleteStore")
    public Result<?> deleteStore(@RequestParam("storeId") String storeId){

        StoreRepositoryDao storeRepositoryDao = new StoreRepositoryDao();
        storeRepositoryDao.setId(storeId);
        storeRepositoryDao.setDelFlag(1);
        int deletedCount = storeManageMapper.updateById(storeRepositoryDao);
        if (deletedCount == 0) {
            log.error("delete sql 返回0，店铺表中未找到id为 {} 的店铺", storeId);
        } else if (deletedCount > 1) {
            log.warn("delete sql 返回{}，删除{}条 id为{}的记录", deletedCount, deletedCount, storeId);
        }

        return Result.ok("店铺删除成功");
    }

    /**
     * 接口1.5 获取所有有效店铺列表，每个店铺仅返回店铺id和店铺名
     * @return
     */
    @GetMapping("/queryStoreList")
    public Result<?> queryStoreList() {

        List<StoreRepositoryDao> stores = storeManageMapper.selectList(new LambdaQueryWrapper<StoreRepositoryDao>().select(StoreRepositoryDao::getId, StoreRepositoryDao::getStoreName));
        List<JSONObject> storeList = new ArrayList<>();
        stores.stream().forEach(store -> {
            JSONObject oneStore = new JSONObject();
            oneStore.put("storeId", store.getId());
            oneStore.put("storeName", store.getStoreName());
            storeList.add(oneStore);
        });

        storeList.sort((o1, o2) -> {
            String storeName1 = o1.getString("storeId");
            String storeName2 = o2.getString("storeId");
            return storeName1.compareTo(storeName2);
        });

        return Result.ok(storeList);
    }

}
